/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pck_com.pck_rrhh.pck_webservices;

import com.tramitedocu.data.TrabajadorData;
import com.tramitedocu.enums.TipoConectividadEnum;
import com.tramitedocu.pojos.Cls_Trabajador;
import com.tramitedocu.pojos.Cls_Unidad_Organizativa;
import java.util.ArrayList;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pck_com.pck_rrhh.pck_src.pck_pojos.Cls_xml_data;
import pck_com.pck_rrhh.pck_src.pck_services.TrabajadorService;
import pck_com.pck_rrhh.pck_src.pck_services.UnidadOrganizativaService;
import pck_com.pck_rrhh.pck_utiles.Cls_Funciones;
import pck_com.pck_rrhh.pck_utiles.Cls_Parametros;

/**
 *
 * @author mx
 */
@Component
@Path("/Trabajador/{tipo_operacion}/{parametro}")
public class TrabajadorWS {

    @Autowired//Me Permite Injectar la Dependencia de Spring
    TrabajadorService trabajadorService;
    @Autowired//Me Permite Injectar la Dependencia de Spring
    UnidadOrganizativaService unidadOrganicaService;

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Object generarWebService(@PathParam("tipo_operacion") String tipo_consulta,
            @PathParam("parametro") String param) {
        Object retorno = null;
        try {
            switch (new Integer(tipo_consulta)) {
                case Cls_Parametros.Trabajador_VALIDAR_LOGIN:
                    return validarLogin(param);
                case Cls_Parametros.Trabajador_OBTENER_TRABAJADORES:
                    return obtenerTrabajadores(param);
                case Cls_Parametros.Trabajador_CANTIDAD_REGISTROS:
                    return obtenerCantidadTrabajadores(param);
                case Cls_Parametros.Trabajador_CANTIDAD_REGISTROS_AREA:
                    return obtenerCantidadTrabajadoresArea(param);
                case Cls_Parametros.Trabajador_OBTENER_TODOS_TRABAJADORES:
                    return obtenerTodosTrabajadores(param);
                case Cls_Parametros.Trabajador_OBTENER_TODOS_TRABAJADORES_MAIL:
                    return obtenerTodosTrabajadoresSoloMail(param);
                case Cls_Parametros.Trabajador_CANTIDAD_TRABAJADORES_MAIL:
                    return obtenerCantidadTrabajadoresSoloMail(param);
                case Cls_Parametros.Trabajador_OBTENER_DATOS_TRABAJADOR:
                    return obtenerDatosTrabajador(param);
                case Cls_Parametros.Trabajador_PRUEBA:
                    return mostrarPrueba(param);
                case Cls_Parametros.Trabajador_OBTENER_TRABAJADOR_CARGOS:
                    return obtenerTodosTrabajadoresCargos(param);
                default:
                    return "";
            }
        } catch (NumberFormatException ex) {
            return null;
        } catch (ArrayIndexOutOfBoundsException ex) {
            return null;
        }
    }

    private Cls_xml_data validarLogin(String parametro) {
        ArrayList<Cls_Trabajador> trabajadores = null;
        try {
            if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
                if (parametro.trim().length() == 4) {
                    String parametrosParaService_01[] = {Cls_Parametros.Map_CODIGO_UNIDAD_ORGANICA, parametro};
                    Cls_Unidad_Organizativa unidad = unidadOrganicaService.obtenerUnidadConResponsable(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01));
                    if (unidad.getEsta_vacaciones() == 1) {
                        parametro = unidad.getEncargado_dni();
                    } else {
                        parametro = unidad.getJefe_dni();
                    }
                }
                String parametrosParaService[] = {Cls_Parametros.Map_DNI, parametro};
                trabajadores = trabajadorService.validarTrabajador(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService));
            } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
                trabajadores = new ArrayList<Cls_Trabajador>();
                trabajadores.add(TrabajadorData.listarAleatorio().get(0));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            TablasWS.estadoConectividad = TipoConectividadEnum.SIN_ACCESO_BD;
            return null;
        }
        if (trabajadores == null) {
            Cls_xml_data cls_xml_data = new Cls_xml_data();
            cls_xml_data.setSuccess(Boolean.FALSE);
            return cls_xml_data;
        }
        return new Cls_xml_data(trabajadores);
    }

    private Cls_xml_data obtenerDatosTrabajador(String parametro) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
            String parametrosParaService[] = {Cls_Parametros.Map_DNI, parametro};
            Cls_Trabajador trabajador = trabajadorService.obtenerDatosTrabajador(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService));
            return new Cls_xml_data(trabajador);
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.listarAleatorio().get(0));
        } else {
            return null;
        }

    }

    private Cls_xml_data obtenerTrabajadores(String param) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
            String datos_recibidos[] = param.split("-");
            String parametrosParaService_01[] = {Cls_Parametros.Map_DNI, datos_recibidos[0]};
            String parametrosParaService_02[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[1] + "%"};
            String parametrosParaService_03[] = {Cls_Parametros.Map_PAGE, datos_recibidos[2]};
            String parametrosParaService_04[] = {Cls_Parametros.Map_PAGE_TAMANIO, datos_recibidos[3]};
            return new Cls_xml_data(trabajadorService.obtenerTodosUsuariosDao(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01, parametrosParaService_02, parametrosParaService_03, parametrosParaService_04)));
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.listarAleatorio().get(0));
        } else {
            return null;
        }

    }

    private Cls_xml_data obtenerCantidadTrabajadores(String parametro) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
            String datos_recibidos[] = parametro.split("-");
            String parametrosParaService_01[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[0] + "%"};
            String retorno = trabajadorService.obtenerCantidadTrabajadores(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01));
            return new Cls_xml_data(retorno == null ? Cls_Parametros.Mensajes_ERROR_CONEXION : retorno);
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.TAMANIO);
        }
        return null;
    }

    private Cls_xml_data obtenerCantidadTrabajadoresArea(String parametro) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
            String datos_recibidos[] = parametro.split("-");
            String parametrosParaService_02[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[0] + "%"};
            String parametrosParaService_01[] = {Cls_Parametros.Map_DNI, datos_recibidos[1]};
            String retorno = trabajadorService.obtenerCantidadTrabajadoresArea(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01, parametrosParaService_02));
            return new Cls_xml_data(retorno == null ? Cls_Parametros.Mensajes_ERROR_CONEXION : retorno);
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.TAMANIO);
        }
        return null;
    }

    private Cls_xml_data obtenerTodosTrabajadores(String parametro) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {
            String datos_recibidos[] = parametro.split("-");
            String parametrosParaService_01[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[0] + "%"};
            String parametrosParaService_02[] = {Cls_Parametros.Map_PAGE, datos_recibidos[1]};
            String parametrosParaService_03[] = {Cls_Parametros.Map_PAGE_TAMANIO, datos_recibidos[2]};
            String parametrosParaService_04[] = null;
            try {
                String dat = datos_recibidos[3];
                String parametrosParaService_04_temp[] = {Cls_Parametros.Map_VACACIONES, "%%"};
                parametrosParaService_04 = parametrosParaService_04_temp;
            } catch (IndexOutOfBoundsException ex) {
                String parametrosParaService_04_temp[] = {Cls_Parametros.Map_VACACIONES, "%0%"};
                parametrosParaService_04 = parametrosParaService_04_temp;
            }
            return new Cls_xml_data(trabajadorService.obtenerTrabajadoresEpsGrau(
                    Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01,
                    parametrosParaService_02, parametrosParaService_03, parametrosParaService_04)));
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.listarAleatorio());
        }
        return null;
    }

    private Cls_xml_data obtenerTodosTrabajadoresCargos(String parametro) {
        if (TablasWS.estadoConectividad == TipoConectividadEnum.CON_ACCESO_BD) {            
            String parametrosParaService_01[] = {Cls_Parametros.Map_DNI,parametro};
            String parametrosParaService_04[] = null;
            
            String parametrosParaService_04_temp[] = {Cls_Parametros.Map_VACACIONES, "%0%"};
            parametrosParaService_04 = parametrosParaService_04_temp;
            
            return new Cls_xml_data(trabajadorService.obtenerTrabajadoresCargosEpsGrau(
                    Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01,parametrosParaService_04)));
        } else if (TablasWS.estadoConectividad == TipoConectividadEnum.SIN_ACCESO_BD) {
            return new Cls_xml_data(TrabajadorData.listarAleatorio());
        }
        return null;
    }

    private Cls_xml_data obtenerTodosTrabajadoresSoloMail(String parametro) {
        String datos_recibidos[] = parametro.split("-");
        String parametrosParaService_01[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[0] + "%"};
        String parametrosParaService_02[] = {Cls_Parametros.Map_PAGE, datos_recibidos[1]};
        String parametrosParaService_03[] = {Cls_Parametros.Map_PAGE_TAMANIO, datos_recibidos[2]};
        return new Cls_xml_data(trabajadorService.obtenerTrabajadoresSoloMailEpsGrau(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01, parametrosParaService_02, parametrosParaService_03)));
    }

    private Object obtenerCantidadTrabajadoresSoloMail(String param) {
        String datos_recibidos[] = param.split("-");
        String parametrosParaService_01[] = {Cls_Parametros.Map_FILTRO_NOMBRE, "%" + datos_recibidos[0] + "%"};
        String retorno = trabajadorService.obtenerCantidadTrabajadoresSoloMailEpsGrau(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService_01));
        return new Cls_xml_data(retorno == null ? Cls_Parametros.Mensajes_ERROR_CONEXION : retorno);
    }

    //agregando metodo para la prueba
    private Cls_xml_data mostrarPrueba(String param) {
        String parametrosParaService[] = {Cls_Parametros.Map_DNI, param};
        Cls_Trabajador trabajador = trabajadorService.mostrarTrabajador(Cls_Funciones.generarHashMapParaSolicitud(parametrosParaService));
        return new Cls_xml_data(trabajador);
    }
}
